package main

import (
	"fmt"
	"sync"
)

/*
sync包 提供了一系列的同步互斥锁
读写锁、互斥锁、条件锁
sync.Mutex 互斥锁
sync.RWMutex 读写
sync.WaitGroup 一个goroutine等待一组goroutine执行完成
sync.Map  并发版本的map
sync.Pool	并发版本的对象池  负责安全的保存一组对象
 */

var num = 20
var wg sync.WaitGroup	//等待组对象
var mutex sync.Mutex	//互斥锁对象
func main(){
	//wg.Add(3)		//等待三个子协程执行完成，设置wg内部计数器
	for i := 0;i<10;i++{
		wg.Add(1)
		name := fmt.Sprintf("协程%d", i)
		go modifynum(name, &wg)
	}
	wg.Wait() //等待wg内部计数器为0，才会继续进行
	fmt.Println("执行结束")
}

func modifynum(name string, wg *sync.WaitGroup){
	defer wg.Done()	//使用wg.Done  减少wg内部的计数器 直到为0
	mutex.Lock() //加锁
	fmt.Println(name, "running....")
	num += 1
	fmt.Println("num is:", num)
	mutex.Unlock()  //释放锁
}